/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package databasehandling;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import model.Billet;
import model.Event;
import model.EventType;
import model.Kasse;
import model.Leverandør;
import model.Salg;
import model.Vare;
import model.VareGruppe;
import utility.DebugUtility;

/**
 *
 * @author Jeppe
 */
public class KasseHandler {

    protected KasseHandler() {
    }

    /**
     *
     * @param cal dd.MM.yyyy
     * @return et kasse objekt der hører til det Calendar-objekt der er kaldt
     * med hvis det altså eksisterer. Ellers returneres null.
     * @throws SQLException
     * @throws ParseException
     */
    public Kasse getKasseVedDato(Calendar cal) throws SQLException, ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        String demandDate = sdf.format(cal.getTime());
        String sql = "CALL `HentKasseVedDato` ('" + demandDate + "')";
        ResultSet rs = DatabaseHandler.getInstance().select(sql);
        Kasse kasse = null;
        while (rs.next()) {
            Calendar dato = Calendar.getInstance();
            dato.setTime(sdf.parse(rs.getString("dato")));
            kasse = new Kasse(rs.getInt("ID"), dato, rs.getInt("startBeholdningDKK"), rs.getInt("startBeholdningEURO"),rs.getBoolean("kasseLukket"), rs.getInt("slutBeholdningDKK"), rs.getInt("slutBeholdningEURO"));
        }
        return kasse;
    }

    public void opretKasse(Kasse kasse) throws SQLException {
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        String kasseDato = sdf.format(kasse.getDato().getTime());
        String sql = "CALL OpretKasse('" + kasseDato + "' , " + kasse.getStartBeholdningDKK() + ", " + kasse.getStartBeholdningEURO() + ","+kasse.isKasseLukket()+")";
        DatabaseHandler.getInstance().execute(sql);
        DebugUtility.getInstance().soutDebugLine(this, 1, "Kasse oprettet og gemt i DB");
    }

    public ArrayList<Salg> hentAlleSalgVedKasse(Kasse kasse) throws SQLException, ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy-HH:mm:ss");
        ArrayList<Salg> salgsListe = new ArrayList<>();

        ResultSet rs = DatabaseHandler.getInstance().select("CALL `HentAlleSalgVedKasse`(" + kasse.getId() + ")");
        while (rs.next()) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(sdf.parse(rs.getString("DatoTid")));
            Salg salg = new Salg(rs.getInt("ID"), cal, rs.getInt("totalbeløb"), rs.getBoolean("dankort"), rs.getBoolean("valutaDKK"));
            salgsListe.add(salg);
        }
        
        for (int i = 0; i < salgsListe.size(); i++) {
            salgsListe.get(i).setVareSalgsListe(HandlerFactory.getInstance().getSalgsHandler().hentVarerTilknyttetSalg(salgsListe.get(i)));
        }
        
        return salgsListe;
    }

    public ArrayList<Vare> hentAlleVarerFraSalg(Salg salg) throws SQLException {
        ArrayList<Vare> vareliste = new ArrayList<>();
        ResultSet rs = DatabaseHandler.getInstance().select("CALL `HentVarerTilknyttetSalg`(" + salg.getId() + ")");
        while (rs.next()) {
            vareliste.add(new Vare(rs.getInt("Varenummer"), rs.getString("Varenavn"), rs.getInt("Indkøbspris"), rs.getInt("UdsalgsprisDK"), rs.getInt("UdsalgsprisEURO"), rs.getInt("Rabat"),rs.getInt("Antal"), new VareGruppe(rs.getInt("VaregruppeNr"), rs.getString("Navn")), new Leverandør(rs.getInt("LeverandørID"), rs.getString("Firmanavn"), rs.getString("Kontaktperson"), rs.getString("TlfNr"), rs.getString("Adresse"))));
        }
        return vareliste;
    }

    public ArrayList<Event> hentAlleEventsFraSalg(Salg salg) throws SQLException, ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        ArrayList<Event> eventListe = new ArrayList<>();
        ResultSet rs = DatabaseHandler.getInstance().select("CALL `HentEventsTilknyttetSalg`(" + salg.getId() + ")");
        while (rs.next()) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(sdf.parse(rs.getString("DatoTid")));
            eventListe.add(new Event(rs.getInt("ID"), cal, rs.getInt("antalBestilte"), rs.getInt("antalFremmødte"), rs.getString("sted"), rs.getString("kundeTlf"), new EventType(rs.getInt("ID"), rs.getString("navn"), rs.getInt("prisDKK"), rs.getInt("prisEURO"))));
        }
        return eventListe;
    }

    public ArrayList<Billet> hentBilletTilknyttetSalg(Salg salg) throws SQLException {
        ArrayList<Billet> billetListe = new ArrayList<>();
        ResultSet rs = DatabaseHandler.getInstance().select("CALL `HentBilletTilknyttetSalg`(" + salg.getId() + ")");
        while (rs.next()) {
            billetListe.add(new Billet(rs.getInt("ID"), rs.getString("billetType"), rs.getInt("prisDKK"), rs.getInt("prisEURO")));
        }
        return billetListe;

    }
    public void lukKasse(Kasse kasse) throws SQLException{
        DatabaseHandler.getInstance().execute("CALL `LukKasse`("+kasse.getId()+","+ kasse.getSlutBeholdningDKK()+", "+kasse.getSlutBeholdningEURO()+")");
    }

}
